package com.caigou.desensitization.strategy;

import java.util.*;

public class DesensitizationContext {
	// 控制脱敏字段：key是类名或类对象，value是字段名集合
	private static final ThreadLocal<Map<Class<?>, Set<String>>> FIELD_CONTROL =
			ThreadLocal.withInitial(HashMap::new);
	// 控制是否禁用脱敏的标识
	private static final ThreadLocal<Boolean>                    ENABLED_FLAG  =
			ThreadLocal.withInitial(() -> true);

	/**
	 添加需要脱敏的字段

	 @param clazz  类名或类对象
	 @param fields 需要脱敏的字段名集合
	 */
	public static void addFields(Class<?> clazz, String... fields) {
		Map<Class<?>, Set<String>> map      = FIELD_CONTROL.get();
		Set<String>                fieldSet = map.computeIfAbsent(clazz, k -> new HashSet<>());
		Collections.addAll(fieldSet, fields);
	}

	/**
	 判断是否需要跳过某个字段

	 @param clazz     类名或类对象
	 @param fieldName 字段名
	 @return 如果需要跳过该字段，返回true；否则返回false
	 */
	public static boolean shouldSkipField(Class<?> clazz, String fieldName) {
		Map<Class<?>, Set<String>> map = FIELD_CONTROL.get();
		return map.containsKey(clazz) && map.get(clazz).contains(fieldName);
	}

	/**
	 清除当前线程的脱敏字段控制
	 */
	public static void clear() {
		FIELD_CONTROL.remove();
		ENABLED_FLAG.remove();
	}

	/**
	 临时禁用脱敏（仅当前线程）
	 */
	public static void tempDisEnabled() {
		ENABLED_FLAG.set(false);
	}

	/**
	 启用脱敏（恢复默认值）
	 */
	public static void tempEnable() {
		ENABLED_FLAG.set(true);
	}

	/**
	 当前线程是否启用脱敏
	 */
	public static boolean isTempEnable() {
		return ENABLED_FLAG.get();
	}
}
